---
title: 'docker swarm容器编排'
date: '2023-08-15'
lastmod: '2023-12-01'
tags: ['docker']
# draft: false
summary: 'swarm 作为docker集群管理工具'
# images: ['/static/images/twitter-card.png']
---


**目录**
- [swarm](#swarm)
- [创建集群](#创建集群)
- [自动锁定](#自动锁定)
- [节点切换](#节点切换)
- [节点服务](#节点服务)

#### swarm
swarm 作为docker集群管理工具，主要有以下功能：
- 服务发现和负载均衡
- 自动部署和回滚
- 自动伸缩
- 自动恢复
- 自动更新
- 自动备份  
<br/>
**同等的服务框架有**：
- Kubernetes（K8s）：是一个开源的容器编排平台，用于自动化部署、扩展和管理容器化应用程序。它可以轻松地实现动态添加服务器主机（也称为节点）。
- Spring Cloud：基于Spring Boot的框架，结合服务注册与发现、负载均衡等组件，可以实现动态扩展服务节点的能力。
- Mesos：Mesos是一个开源的分布式系统内核，它提供了动态添加服务器主机的能力。
- Ambari：Ambari是一个管理Hadoop的强大工具，它支持动态添加服务器到Hadoop集群内。
- Nomad：HashiCorp Nomad是一个简单易用的工作负载编排器，用于在本地或云端部署和管理应用程序。它支持动态添加服务器主机来扩展应用程序的部署规模。
但是现在国内基本用的是 Kubernetes和Spring Cloud框架，这些框架基本已经自带了集群管理的功能。


#### 创建集群  

```shell
# 1、创建管理节点 执行此命令会将当前节点设置为管理节点和leader
docker swarm init

# 2、创建工作manager节点
docker swarm join-token manager   # 管理节点
# 指令：docker swarm join --token SWMTKN-1-1rofefy7pd37lblyu79tf394d5ea68nf8p69x9v1m1s907iw7b-b9d0gfqeqz0tetkbtmooocpoa 192.168.64.137:2377
# 创建工作节点
docker swarm join-token worker     
# 指令：docker swarm join --token SWMTKN-1-1rofefy7pd37lblyu79tf394d5ea68nf8p69x9v1m1s907iw7b-cuswxw5f8kkwmbhuipxo47i6k 192.168.64.137:2377

# 3、复制指令到对应的虚拟机节点执行

# 4、查看状态
docker info
# docker info 上包含 Swarm: active 说明集群已经创建成功 属性上有对应的节点信息
docker node ls
# 可以看到集群的状态，但是工作节点上不可以使用这两个命令，因为工作节点上没有管理节点的权限
# 若是有节点关闭了， docker node ls 看到的节点状态是 Down

# 5、关闭节点
docker swarm leave
# 关闭管理节点
docker swarm leave -f

# 通过 docker node ls 可以看到新的集群节点
# 6、删除节点 不是 down 状态的节点不能删除
docker swarm rm 节点ID

docker node update --availability drain 节点ID
# 节点状态为 drain 表示节点已经被标记为不可用状态，不会接收新的任务。
docker node update --availability pause 节点ID
# 节点状态为 pause 表示节点已经被暂停，不会接收新的任务。
docker node update --availability  节点ID
```
`docker swarm rm`是强制在 `docker node ls` 列表删除，若是节点没有移除集群，节点再次进入集群会报错，节点要先离开集群然后才能再次加入集群。    
集群leader角色在挂掉后，集群会重新选举一个新的leader。再次进入集群后，会自动加入集群，但是是manager的角色了，不再是leader角色。


#### 自动锁定
`docker swarm update --autolock true` 锁定集群，防止其他用户修改集群配置。
锁定后的集群无法修改，只能通过 `docker swarm unlock` 解锁。
解锁后，其他用户可以修改集群配置。   
锁定后变化：
- 之前加入集群的节点在关闭docker服务后，无法重新加入集群。
- `systemctl stop docker` 无法关闭。

```shell
# 获取之前设定autolock的解锁密钥
docker swarm unlock-key

# 解锁集群 节点重新加入集群
docker swarm unlock  # 解锁密钥，输入之前获取的解锁密钥

```
已经创建的集群的manager，无法作为创建新集群的leader，要先离开当前集群 `docker swarm leave`。


#### 节点切换
不管是manager还是worker节点，都可以通过以下命令切换节点。
```shell
# 切换到manager节点
docker node update --role manager 节点ID

# 切换到worker节点
docker node update --role worker 节点ID

# 服务主机切换 promote-升级、demote-降级
docker node promote  节点ID
docker node demote  节点ID
```
**更新节点信息**
```shell
# 更新节点信息
docker node update 节点ID --label-add 标签名=标签值
docker node update 节点ID --label-rm 标签名
docker node update 节点ID --availability active
docker node update 节点ID --availability drain
docker node update 节点ID --availability pause
```

通过 `docker node inspect 节点ID` 可以查看节点信息。 


#### 节点服务

```shell
# 创建服务  replicas 的数值大于节点数，会自动创建多个副本
docker service create --name 服务名 --replicas 副本数 --publish 端口:端口 镜像名
# 查看服务
docker service ls
# 查看一个服务详情
docker service ps 服务名
# 查看节点的服务
docker node ps
# 删除服务
docker service rm 服务名

# 查看节点服务日志
docker service logs 服务ID
# 查看节点服务日志 跟随
docker service logs -f 服务ID
# 查看节点服务日志 跟随 显示时间戳
docker service logs -f --timestamps 服务ID
# 查看节点服务日志 跟随 显示时间戳 显示详细信息
docker service logs -f --timestamps --details 服务ID
```
